package com.neuedu.yyzx.service.impl;

import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.neuedu.yyzx.mapper.MenuMapper;
import com.neuedu.yyzx.mapper.RoleMapper;
import com.neuedu.yyzx.mapper.RoleMenuMapper;
import com.neuedu.yyzx.po.Role;
import com.neuedu.yyzx.po.RoleMenu;
import com.neuedu.yyzx.service.MenuService;
import com.neuedu.yyzx.service.RoleService;
import com.neuedu.yyzx.vo.RoleEditVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Administrator
 * @description 针对表【role(角色表)】的数据库操作Service实现
 * @createDate 2025-04-08 09:23:03
 */
@Service
public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role>
        implements RoleService {


    @Autowired
    MenuMapper menuMapper;

    @Autowired
    MenuService menuService;

    @Autowired
    RoleMenuMapper roleMenuMapper;


    @Override
    public List<Role> queryUserRoleList(Long userId) {
        return getBaseMapper().selectUserRoleList(userId);
    }


    /**
     * 编辑前初始化页面的
     * 用于查询角色信息、菜单树形信息，以及修改时需要把角色拥有的菜单ids查询出来用于勾选 已授权的菜单
     *
     * @param id
     * @return
     */
    @Override
    public RoleEditVO editInit(Long id) {
        RoleEditVO vo = new RoleEditVO();

        if (id != null) {
            // 页面需要查询 角色基础信息
            vo.setRole(getBaseMapper().selectById(id));

            // 角色已授权的菜单项
            vo.setGrantMenuIds(menuMapper.getRoleGrantMenu(id));
        }

        // 所有菜单列表，树形 父子结构
        vo.setAllMenuList(menuService.getAllTree());


        return vo;
    }


    @Transactional
    @Override
    public boolean saveOrUpdate(Role entity) {

        // 自带的 saveOrUpdate
        boolean success = super.saveOrUpdate(entity);

        // 角色Id
        Long roleId = entity.getId();

        // 处理角色授权菜单
        List<RoleMenu> roleMenus = new ArrayList<>();// 存储构造的roleMenu数据
        // 已授权的菜单Ids
        List<Long> grantMenuIds = entity.getGrantMenuIds();
        // 构造已授权的RoleMenu数据
        grantMenuIds.forEach(menuId -> {
            roleMenus.add(new RoleMenu(roleId, menuId));
        });

        // 删除已经授权的菜单
        UpdateWrapper<RoleMenu> deleteWrapper = new UpdateWrapper<>();
        deleteWrapper.eq("role_id", roleId);
        roleMenuMapper.delete(deleteWrapper);
        // 2 重新构造数据 再次插入
        roleMenuMapper.insert(roleMenus);

        return success;
    }
}




